library(dplyr)
library(knitr)
library(maptools)
library(TreeSegmentation)
library(ggplot2)
library(rgl)
library(clue)
library(lidR)
knit_hooks$set(webgl = hook_webgl)

opts_chunk$set(warning=F,message=F)

#set color ramp for treeID
col = pastel.colors(200)

Load in ground-truth

shps<-list.files("/Users/ben/Dropbox/Weecology/ECODSEdataset/Task1/ITC/",pattern=".shp",full.names = T)
itcs<-lapply(shps,readShapePoly)
itcs[[1]]
## class       : SpatialPolygonsDataFrame 
## features    : 9 
## extent      : 402390.1, 402416, 3286283, 3286317  (xmin, xmax, ymin, ymax)
## coord. ref. : NA 
## variables   : 3
## names       : crown_id, confidence,  Plot_ID 
## min values  :       31,       High, OSBS_001 
## max values  :      565,       High, OSBS_001
names(itcs)<-sapply(itcs,function(x){
  id<-unique(x$Plot_ID)
  })
print(names(itcs))
##  [1] "OSBS_001" "OSBS_003" "OSBS_006" "OSBS_007" "OSBS_008" "OSBS_009"
##  [7] "OSBS_010" "OSBS_011" "OSBS_014" "OSBS_015" "OSBS_016" "OSBS_017"
## [13] "OSBS_018" "OSBS_019" "OSBS_025" "OSBS_026" "OSBS_029" "OSBS_030"
## [19] "OSBS_032" "OSBS_033" "OSBS_034" "OSBS_035" "OSBS_036" "OSBS_037"
## [25] "OSBS_038" "OSBS_042" "OSBS_043" "OSBS_044" "OSBS_048" "OSBS_051"
plot(ground_truth<-itcs[[1]])

itcs[[1]]
## class       : SpatialPolygonsDataFrame 
## features    : 9 
## extent      : 402390.1, 402416, 3286283, 3286317  (xmin, xmax, ymin, ymax)
## coord. ref. : NA 
## variables   : 3
## names       : crown_id, confidence,  Plot_ID 
## min values  :       31,       High, OSBS_001 
## max values  :      565,       High, OSBS_001
#proj_itc <-spTransform(itc, CRS("+init=epsg:32617"))

Find corresponding tile

fname<-get_tile_filname(itcs[[1]])
tile<-readLAS(paste("/Users/ben/Dropbox/Weecology/NEON/cropped_",fname,sep=""))
#plot(tile)

Silva 2016 Crown Segmentation Model

silva<-silva2016(tile=tile,extra=T)
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.360   0.026   2.404 
## [1] "Creating tree polygons"

Overlay ground truth and predictions

plot(ground_truth,col='red')
plot(silva$silva_convex,add=T)

Classified lidar cloud versus predicted polygons

plot(silva$silva_tile,color="treeID",col=col,size=2)
show2d(face='z+',z=0,{
  plot(silva$silva_convex,col=rgb(255, 0, 0, 30, maxColorValue=255) )
})

Classified lidar cloud versus ground_truth

plot(silva$silva_tile,color="treeID",col=col)
show2d(face='z+',z=0,{
  plot(ground_truth,col=rgb(255, 0, 0, 30, maxColorValue=255) )
})

You must enable Javascript to view this page properly.

Assign Trees

Each tree is assigned based on the maximum overlap. Pairwise membership is done using a Hungarian Algorithm. See clue::solve_LSAP.

assignment<-assign_trees(ground_truth,prediction=silva$silva_convex)

Intersection over union

#loop through assignments and get jaccard statistic for each assignment pair
statdf<-calc_jaccard(assignment=assignment,ground_truth = ground_truth,prediction=silva$silva_convex)
qplot(statdf$IoU)

mean(statdf$IoU)
## [1] 8.476192
median(statdf$IoU)
## [1] 0.1739069

As a wrapper for one tile

silvadf<-evaluate(ground_truth=itcs[[6]],algorithm = "silva")
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.287   0.018   2.330 
## [1] "Creating tree polygons"
mean(silvadf$IoU)
## [1] 0

Wrapper across all tiles

system.time(silvadf<-evaluate_all(itcs=itcs,algorithm = "silva"))
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.303   0.019   2.332 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.144   0.019   2.170 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.221   0.023   2.253 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.184   0.018   2.211 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.181   0.016   2.204 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.157   0.016   2.183 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.160   0.016   2.186 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.135   0.014   2.155 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.181   0.020   2.210 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.309   0.019   2.336 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.155   0.014   2.175 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.123   0.012   2.139 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.140   0.012   2.155 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.248   0.014   2.263 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.129   0.013   2.145 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.231   0.011   2.244 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.115   0.013   2.133 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.230   0.012   2.246 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.141   0.014   2.158 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.252   0.012   2.267 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.133   0.011   2.146 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.119   0.011   2.133 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.129   0.012   2.143 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.063   0.012   2.078 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.123   0.011   2.135 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.145   0.017   2.165 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.140   0.015   2.163 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.174   0.017   2.193 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.087   0.014   2.103 
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
##    user  system elapsed 
##   2.226   0.014   2.242 
## [1] "Creating tree polygons"
##    user  system elapsed 
## 175.138   1.538 177.149
qplot(silvadf$IoU)

mean(silvadf$IoU)
## [1] 0.1514519